package main

import (
	"fmt"
	"math"
)

type struct1 struct {
	x, y float64
}

var m map[string]struct1

func compute(fn func(float64, float64) float64) float64 {
	return fn(3, 4)
}
func main() {
	// 映射，将键映射到值，映射的零值为 nil 。nil 映射既没有键，也不能添加键。
	// make 函数会返回给定类型的映射，并将其初始化备用。
	// 个人不知道如何解释，程序面看起来，就是一个集合 然后集合的值是一个结构体
	m = make(map[string]struct1)
	m["test"] = struct1{
		3.1415926, -98.0987,
	}
	fmt.Println(m)
	fmt.Println(m["test"])

	// 正常的map集合
	new_map1 := map[string]int{
		"test": 1423,
		"asd":  456,
	}
	fmt.Println(new_map1)

	delete(new_map1, "asd")
	fmt.Println(new_map1)
	// 通过双赋值可以检测某个键值是否存在
	v, ok := new_map1["asd"]
	// 得到的结果是0 false
	fmt.Println(v, ok)

	// 函数也是值；它们可以像其他值一样传递。
	hypot := func(x, y float64) float64 {
		return math.Sqrt(x*x + y*y)
	}
	fmt.Println(hypot(5, 12))
	fmt.Println(compute(hypot))
	fmt.Println(compute(math.Pow))
}
